Linux Cgroup 限制磁盘IO速率

1 本章说明

本文主要介绍如何在 Linux 系统上限制磁盘IO 的读写速率。

2 如何使用 blkio 限制磁盘IO速率

blkiocgroup 中的一个子系统,可以用于限制及监控磁盘读写io

2.1 blkio 工作原理

  1. blkio 控制子系统可以限制进程读写磁盘 IOPS 和速率。
  2. 由于 Buffered I/O 指会经过 PageCache 然后再写入到存储设备中。所以对 Buffered I/O 的文件中读写无法进行限制。
Note

这里面的 Buffered 的含义跟内存中 buffer cache 不同,这里的 Buffered 含义相当于内存中的 buffer cache + page cache

2.2 blkio 子系统配置文件

  1. blkio 子系统涉及限制磁盘读写 io 的配置文件有以下几个:
ll /sys/fs/cgroup/blkio/
...............
-r--r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.io_service_bytes
-r--r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.io_service_bytes_recursive
-r--r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.io_serviced
-r--r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.io_serviced_recursive
-rw-r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.read_bps_device
-rw-r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.read_iops_device
-rw-r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.write_bps_device
-rw-r--r-- 1 root root 0  4月 15 10:11 blkio.throttle.write_iops_device
...............
  1. 可以通过 echo 命令指定 磁盘设备号磁盘读写数值 实现限制磁盘读写IO。
echo "<disk-number> <io-value>"  > /sys/fs/cgroup/blkio/<io-type>
参数 说明
disk-number 指定需要限制的磁盘编号,可通过 `ll /dev/block/
io-value 指定需要限制的io数值(数值为0表示不限制),当指定的文件名称为 blkio.throttle.write_bps_device ,则表示限制写入带宽,单位为B/s
io-type 指定需要限制的io类型。
blkio.throttle.write_bps_device :磁盘写入带宽限制
blkio.throttle.write_iops_device:磁盘写入IOPS限制。
blkio.throttle.read_bps_device:磁盘读取带宽限制 。
blkio.throttle.read_iops_device:磁盘读取IOPS限制 。

3 查看磁盘编号

  1. 查看 sda 磁盘对应编号为 8:0
#root>
ll /dev/block/ | grep sda
rwxrwxrwx 1 root root 6  4月 14 17:07 8:0 -> ../sda
lrwxrwxrwx 1 root root 7  4月 14 17:07 8:1 -> ../sda1
lrwxrwxrwx 1 root root 7  4月 14 17:07 8:2 -> ../sda2
lrwxrwxrwx 1 root root 7  4月 14 17:07 8:3 -> ../sda3

4 限制sda 磁盘写入速率

  1. 限制 sdb 磁盘读取速率为 1MB/s
    计算公式:1MB/s * 1024 * 1024 = 1048576
#root>
echo "8:0 1048576" >> /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
cat /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
8:0 1048576
  1. 验证已添加磁盘写入限制。
dd if=/dev/zero of=/dev/sda bs=1M count=10 oflag=direct
录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB,10 MiB)已复制,9.99642 s,1.0 MB/s

5 解除sda磁盘写入限制

#root>
echo "8:0 0" >> /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
cat /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
  1. 验证已解除磁盘写入限制
#root> 
dd if=/dev/zero of=/dev/sda bs=1M count=100 oflag=direct
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB,100 MiB)已复制,0.258758 s,405 MB/s

6 限制sda 磁盘读取速率

  1. 限制 sdb 磁盘读取速率为 1MB/s
    计算公式:1MB/s * 1024 * 1024 = 1048576
#root>
echo "8:0 1048576" >> /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
cat /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
8:0 1048576
  1. 验证已添加磁盘写入限制。
dd if=/dev/sda of=/dev/sda bs=1M count=10  oflag=direct
录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB,10 MiB)已复制,12.4523 s,842 kB/s

7 解除 sda 磁盘读取限制

#root>
echo "8:0 0" >> /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
cat /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
  1. 验证已解除磁盘写入限制
dd if=/dev/sda of=/dev/sda bs=1M count=10  oflag=direct
录了10+0 的读入
记录了10+0 的写出
10485760字节(10 MB,10 MiB)已复制,0.029048 s,361 MB/s